package org.zjt.spark.github

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.fpm.AssociationRules
import org.apache.spark.mllib.fpm.FPGrowth.FreqItemset

/**
  * 关联规则挖掘(Association Rule)
  * 物体间的关联度
  *
  * b到a的关联度： P(b->a) = p(a,b) / p(b)  既是在买b的情况下再买a的频率。
  *
  * 可以得到同现矩阵的相关度
  *
  */
object AssociationRulesExample {

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("AssociationRulesExample").setMaster("local[2]")
    val sc = new SparkContext(conf)


    // 支持AB商品的频数
    //  ab -> FreqItemset(a) FreqItemset(b) FreqItemset(a,b)
    val freqItemsets = sc.parallelize(Seq(
      new FreqItemset(Array("a"), 15L),
      new FreqItemset(Array("b"), 16L),
      new FreqItemset(Array("a", "b"), 14L)
    ))


    //可信度（Confidence）设W 中支持物品集A 的事务中，有c ％的事务同时也支持物品集B，c ％称为关联规则A→B 的可信度。
    // a可信度： 支持a->b频数 除以 支持a的频率
    // b可信度： 支持b->a频数 除以 支持b的频率
    val ar = new AssociationRules().setMinConfidence(0.8) //设置最小可信度
    val results = ar.run(freqItemsets)


    results.collect().foreach { rule =>
      println("[" + rule.antecedent.mkString(",") + "=>" + rule.consequent.mkString(",") + "]," + rule.confidence)
    }
    sc.stop()
  }

}

